const express=require('express')
const app=express()
const cors=require('cors')
// 解决跨域问题
app.use(cors())
// 解析post表单的数据
// 配置解析表单数据的中间件，注意：这个中间件，只能解析 application/x-www-form-urlencoded 格式的表单数据
var bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({extended:true}))

// 将uploads的文件托管成静态的文件目录
app.use('/uploads',express.static('./uploads'))

// 导入Joi
const joi = require('joi')

// 导入解析token的配置文件
var { expressjwt:jwt } = require("express-jwt")

// 导入秘钥的文件
const config=require('./config')

// 导入登录注册路由模块
const router =require('./router/user')

// 导入获取用户信息的路由模块
const userinfo_router=require('./router/userinfo')

// 导入文章分类的路由模块
const artCateRouter=require('./router/artcate')

// 文章管理路由模块
const articleRouter=require('./router/article')

// 封装一个全局的中间件函数
app.use(function(req,res,next){
    // 传递两个参数，一个是错误的信息对象，还有一个是状态码
    res.cc=function(err,status=1){
        res.send({
            status,
            // 判断err是字符串还是错误对象
            message:err instanceof Error ?err.message : err
        })
    }
    next()
})

// 添加解析token字符串的中间件
app.use(jwt({secret:config.jwtSecretKey,algorithms: ["HS256"]}).unless({path:[/^\/api\//]}))

// 将登录和注册的路由模块挂载到路由上
app.use('/api',router)

// 获取用信息的路由模块
app.use('/my',userinfo_router)

// 获取文章分类的路由模块
app.use('/my/article',artCateRouter)

// 文章管理的路由模块
app.use('/my/article',articleRouter)

// 捕获验证错误的中间件
app.use((err,req,res,next)=>{
// 数据验证失败
    if(err instanceof joi.ValidationError) return res.cc(err)
    // 解析jwt字符串错误的中间件
    if(err.name==='UnauthorizedError') res.cc('身份认证失败')
// 未知的错误
   res.cc(err)

  next()
})

// 启动服务器
app.listen(3007,()=>{
  console.log("Server running at http://127.0.0.1:3007");
})